package net.alche.al.util.alches;

import net.alche.al.util.AC;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Date相关的工具方法
 * 
 * @author：levi @date：2018/12/28 14:10
 */
@SuppressWarnings("all") 
public class ToolDate {
  private final SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
  private final SimpleDateFormat formatDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  private final SimpleDateFormat formatTime = new SimpleDateFormat("HH:mm:ss");

  /** 格式化日期 yyyy-MM-dd */
  public final String FMT_DATE = "yyyy-MM-dd";

  /** 格式化日期时间 yyyy-MM-dd HH:mm:ss */
  public final String FMT_DATE_TIME = "yyyy-MM-dd HH:mm:ss";

  /** 格式化日期时间 yyyy-MM-dd HH:mm:ss */
  public final String FMT_TIME = "HH:mm:ss";

  /**
   * 获取日期类型参数值 format 参数推荐使用FMT_XXX常量
   * 
   * @param v      字符串格式的日期
   * @param format 日期格式(yyyy-MM-dd HH:mm:ss)
   * @return Date类型数据,如果为空返回null,转换异常也返回null(会打印error日志)
   **/
  public Date parse(String v, String format) {
    if (AC.isNotEmpty(v)) {
      if (v.equals("new")) {
        return new Date();
      }
      if (format == null) {
        int split = v.indexOf("-");
        int colon = v.indexOf(":");
        if (split >= 0 && colon >= 0) {
          format = FMT_DATE_TIME;
        } else if (split >= 0) {
          format = FMT_DATE;
        } else if (colon >= 0) {
          format = FMT_TIME;
        }
      }
      try {
        if (format.equals(FMT_DATE)) {
          return formatDate.parse(v);
        } else if (format.equals(FMT_DATE_TIME)) {
          return formatDateTime.parse(v);
        } else {
          SimpleDateFormat sdf = new SimpleDateFormat(format);
          return sdf.parse(v);
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return null;
  }

  /**
   * 格式日期
   * 
   * @param v 字符串数据(yyyy-MM-dd)
   * @return
   */
  public Date parseDate(String v) {
    return parse(v, FMT_DATE);
  }

  /**
   * 自动识别日期格式
   * 
   * @param v
   * @return
   */
  public Date parseAuto(String v) {
    if (AC.isEmpty(v))
      return null;
    if (v.contains(":")) {
      return parseDatetime(v);
    } else {
      return parseDate(v);
    }
  }

  /**
   * 格式日期和时间
   * 
   * @param v 字符串数据(yyyy-MM-dd HH:mm:ss)
   * @return
   */
  public Date parseDatetime(String v) {
    return parse(v, FMT_DATE_TIME);
  }

  /**
   * 获取日期类型参数值 format 参数推荐使用FMT_XXX常量
   * 
   * @param date   Date对象
   * @param format 日期格式(yyyy-MM-dd HH:mm:ss)
   * @return String类型数据,如果为空返回null,转换异常也返回null(会打印error日志)
   **/
  public String fmt(Date date, String format) {
    if (date != null) {
      try {
        if (format.equals(FMT_DATE)) {
          return formatDate.format(date);
        } else if (format.equals(FMT_DATE_TIME)) {
          return formatDateTime.format(date);
        } else {
          SimpleDateFormat sdf = new SimpleDateFormat(format);
          return sdf.format(date);
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return null;
  }

  /**
   * 格式日期
   * 
   * @param date 日期对象
   * @return 字符串数据(yyyy-MM-dd HH:mm:ss)
   */
  public String fmtDatetime(Date date) {
    return fmt(date, FMT_DATE_TIME);
  }

  /**
   * 格式日期
   * 
   * @param date 日期对象
   * @return 字符串数据(yyyy-MM-dd)
   */
  public String fmtDate(Date date) {
    return fmt(date, FMT_DATE);
  }
}
